SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[paChequearIntervaloLicencias]

-- En fase de prueba - Chequea licencias 135b c/g y 135b con 50%  
--02/06/2009  - Sanes Jorge, Otero Marcelo
--08/06/2009  - Se agregaron Licencias Historicas para el control


@Agente INT,
@Licencia5Y6 int,
@FechaDesde DATETIME,
@FechaHasta DATETIME,
@Estado INT OUTPUT,  -- 0 = Nada /  3 = Error se supera algun tope establecido
@Diagnostico VARCHAR(200) OUTPUT

AS
SET NOCOUNT On
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

DECLARE @FA DATETIME
DECLARE @FAINT INT
DECLARE @FB DATETIME
DECLARE @FBINT INT
DECLARE @LICENCIA INT
DECLARE @AGENTE56 INT 


DECLARE @Error int
DECLARE @DIASDELICENCIA5 INT
DECLARE @DIASDELICENCIA6 INT
DECLARE @FECHAALPHA DATETIME
DECLARE @FECHAOMEGA DATETIME
declare @fechafin datetime
declare @diasapasar int

DECLARE @PERIODO INT
DECLARE @PRIMER5 INT
DECLARE @PRIMER6 INT

DECLARE @TOPELIC5 INT
DECLARE @TOPELIC6 INT
declare @DIASENTREPERIODOS int
declare @diascontrol int
declare @ultimalicencia int
declare @ultimoregistro int

SELECT @Diagnostico=''
SELECT @Estado=0
SELECT @TOPELIC5=DURACIONMAXIMA  FROM tb_Licencias WHERE idLicencia=5
SELECT @TOPELIC6=DURACIONMAXIMA  FROM tb_Licencias WHERE idLicencia=6
SELECT @DIASENTREPERIODOS=VALOR1 FROM tb_Parametros where Parametro='DiasEntrePeriodosLic5y6'

select @diasapasar=DATEDIFF(day,@fechadesde,@fechahasta)+1

BEGIN TRANSACTION
    SET @Error=0
	SET @fechaalpha = '01/01/1990'			
	
	IF @FechaHasta > GETDATE()
		SET @fechaomega = @FechaHasta
	else 
		SET @fechaomega=GETDATE()

	IF object_id('tempdb..#Control1') IS NOT NULL  --para contar dias
			DROP TABLE #Control1
	IF object_id('tempdb..#Control2') IS NOT NULL  --lleva tope de fechas por tipo de licencia
			DROP TABLE #Control2
			
	CREATE TABLE #Control1 ( IDFecha INT PRIMARY KEY , LICENCIA INT)
	SET @Error = @@ERROR 
	IF @Error <> 0 GOTO Salir	

	SET @fa=@fechaalpha
	SET @fb=@fechaomega
	WHILE (@FA<=@FB)
		      BEGIN
		         SET @FAINT=convert(int,datepart(year,@FA)*10000+ datepart(month,@FA)*100+datepart(day,@FA))
	  	         Insert #Control1 VALUES (@faint,0)
	             SET @FA=DATEADD(DAY,1,@FA) 
		      END
	SET @Error = @@ERROR 
	IF @Error <> 0 GOTO Salir
	
	CREATE TABLE #Control2(idcontrol INT IDENTITY NOT NULL PRIMARY KEY,  Agente56 INT,  LICENCIA INT,PERIODO INT, FECHAI DATETIME,FECHAF DATETIME,DIAS INT)
	SET @Error = @@ERROR 
	IF @Error <> 0 GOTO Salir
	
             SET @PERIODO =1
             SET @PRIMER5 =1
             SET @PRIMER6 =1
	
	
	DECLARE  TTAS CURSOR FORWARD_ONLY FOR
		 
	select s.agente, ss.FechaAlta,ss.FechaBaja,ss.LICENCIA from tb_ServiciosAgentes s 
	inner join tb_SubserviciosAgentes ss on s.idServicioAgente=ss.ServicioAgente
	where S.AGENTE=@AGENTE AND ss.Licencia IN (5,6)
             union all
             SELECT agente,  fechaalta,fechabaja,licencia FROM tb_LicenciasHistoricas WHERE Licencia IN (5,6) AND Agente=@agente

	ORDER BY ss.FECHAALTA
	  	
              open TTAS
 	fetch next from TTAS into @AGENTE56,  @FA,@FB,@LICENCIA
    
	while @@FETCH_STATUS = 0
	  BEGIN

	       IF (@FA<@fechaalpha)
                            SET @FA=@fechaalpha
	       IF (@FB IS NULL) OR (@FB>@fechaomega)
                            SET @FB=@fechaomega
	
	       declare @licenciab int  
		                 
	      WHILE (@FA<=@FB)
	        BEGIN
	            SET @FAINT=convert(int,datepart(year,@FA)*10000+ datepart(month,@FA)*100+datepart(day,@FA))
	            select @licenciab=licencia from #Control1 where IDFecha = @FAINT
	            if @licenciab=0 and @licencia=5             
	                  update #Control2 set dias=dias+1  WHERE LICENCIA=5 AND PERIODO=@PERIODO
	            if @licenciab=0 and @licencia=6          
	                  update #Control2 set dias=dias+1  WHERE LICENCIA=6 AND PERIODO=@PERIODO-1        
	                  
	            UPDATE #Control1 SET LICENCIA =@LICENCIA WHERE IDFecha = @FAINT    

			
  	                      IF (@FA >= @fechadesde AND @FA <= @fechahasta) AND (@Licencia = @Licencia5Y6)
 			BEGIN
	                             SET @diasapasar = @diasapasar - 1
			   PRINT @diasapasar
			END

	         	                                   
	            IF @LICENCIA=5 
	              IF  @PRIMER5=1
	                 BEGIN
	                      SET @PRIMER5=0
	                      SET @PRIMER6=1
	                      INSERT #Control2 VALUES (@AGENTE56,  @LICENCIA,@PERIODO,@FA,@FA,1)
	
	                      		                      
	                 END
	             ELSE
	                 UPDATE #Control2 SET FECHAF=@FA WHERE LICENCIA=5 AND PERIODO=@PERIODO 
	          
	          IF @LICENCIA=6 
	             IF  @PRIMER6=1
	                 BEGIN
	                      SET @PRIMER6=0
	                      SET @PRIMER5=1
	                      INSERT #Control2 VALUES (@AGENTE56,  @LICENCIA,@PERIODO,@FA,@FA,1)
	                      SET @PERIODO=@PERIODO +1
	                      
	                 END
	              ELSE
	                 UPDATE #Control2 SET FECHAF=@FA WHERE LICENCIA=6 AND PERIODO=@PERIODO-1
	           
			 SET @FA=DATEADD(DAY,1,@FA) 
                      END
		
	         fetch next from TTAS into @AGENTE56,  @FA,@FB,@LICENCIA
		
	END
	
	--controlo que no haya licencias que esten superando los topes
	
	if exists (select top 1 * from #Control2 where licencia=5 and DIAS>@TOPELIC5)
			begin
				SELECT @Estado = 3, @Diagnostico = '*' + '*Error! El agente tiene una licencia 135b con goce de haberes que supera el limite de '+ CONVERT(varchar,@topelic5)+' dias, arregle dicha licencia y vuelva a intentar'
				GOTO SALIR
			end
	if exists (select top 1 * from #Control2 where licencia=6 and DIAS>@TOPELIC6)
			begin
				SELECT @Estado = 3, @Diagnostico = '*' + '*Error! El agente tiene una licencia 135b con 50% goce de haberes que supera el limite de '+ CONVERT(varchar,@topelic6)+' dias, arregle dicha licencia y vuelva a intentar'
				GOTO SALIR
			end

            select @ultimoregistro=MAX(idcontrol) from #control2 
            select @ultimalicencia=licencia,@diascontrol=dias,@fechafin=FECHAF from #Control2 where idcontrol=@ultimoregistro
 
    -- control sobre licencia 5y6
 
    if @Licencia5Y6=5
      begin 
       if @ultimalicencia=5 
         begin    
          if (@diascontrol+@diasapasar)>@TOPELIC5
             
			 begin
			 
					SELECT @Estado = 3, @Diagnostico = '*' + '*Error! Se supera en '+convert(varchar,ABS((@diascontrol+@diasapasar)-@TOPELIC5))+' dias el tope de 730 dias para este tipo de licencia. '+ '*' +'Debe registrar una licencia 135b largo tratamiento con 50% de hab.'
					GOTO SALIR
			 end
		 end
		ELSE
		 BEGIN 
		   IF @diascontrol<@TOPELIC6
		     begin
		      
				    SELECT @Estado = 3, @Diagnostico = '*' + '*Error! El agente debe completar los 365 dias de licencia 135b 50%, restan '+convert(varchar,@TOPELIC6-@diascontrol)+' dias.'
					GOTO SALIR
			 end
		   IF @diascontrol=@TOPELIC6 and (abs(DATEDIFF(day,@FechaDesde,@fechafin))<@DIASENTREPERIODOS)
		     begin
				    SELECT @Estado = 3, @Diagnostico = '*' + '*Error! Deben pasar 1095 dias antes de poder tomar la licencia nuevamente, restan '+CONVERT(varchar,@DIASENTREPERIODOS-abs(DATEDIFF(day,@FechaDesde,@fechafin)))+' dias.'
					GOTO SALIR
			 end
		   
		 END
	   end  
	else
	  begin
       if @ultimalicencia=6 
         begin       
          if (@diascontrol+@diasapasar)>@TOPELIC6
             begin
              
					SELECT @Estado = 3, @Diagnostico = '*' + '*Error! Se supera en '+convert(varchar,abs((@diascontrol+@diasapasar)-@TOPELIC6))+' dias el tope de 365 dias para este tipo de licencia'
					GOTO SALIR
			 end
		 end
		ELSE
		 BEGIN
		   IF @diascontrol<@TOPELIC5
		     begin
				    SELECT @Estado = 3, @Diagnostico = '*' + '*Error! El agente debe completar los 730 dias de licencia 135b c/g, restan '+CONVERT(varchar,@TOPELIC5-@diascontrol)+' dias.'
					GOTO SALIR
			 end
		   IF @diascontrol=@TOPELIC5 and (@diasapasar>@topelic6)
		     begin
				    SELECT @Estado = 3, @Diagnostico = '*' + '*Error! Se supera en '+convert(varchar,ABS(@topelic6-@diasapasar))+' dias el tope de 365 dias para este tipo de licencia'
					GOTO SALIR
			 end   
		 END
	   end 	 
	         
SALIR:

close TTAS
deallocate TTAS
		

SELECT * FROM #CONTROL2

IF @Error <> 0 
	ROLLBACK TRANSACTION
ELSE 
	COMMIT TRANSACTION
GO
